2. 名称、赋值与函数 Names, Assignments & Functions
赋值语句的意义:变量名 = 表达式,将表达式的值赋给以变量名为名的变量。赋值是一种进行抽象的手段,可以将一些值抽象为名称。
定义函数是一种更为强大的抽象方法,将表达式与一系列语句抽象为某个命名下的整体,而无需关注内部细节。
Python 中定义函数的范式:
def <函数名> (<形参表>): # 函数签名
# 函数体
...
return <返回表达式>
该语句的执行过程如下:
- 根据函数签名新建一个函数
- 设置函数的主体部分
- 将新建好的该函数赋值给函数名
注意新建函数不代表执行函数内的任何语句。
调用该函数的过程如下:
- 新建一个局部帧(Local Frame) 以形成一个环境。
- 在该帧中,将形参表内的形参赋以传入的参数值。
- 在新环境中执行函数主体。
一个环境是一系列的帧,一个帧是名称与值的绑定关系。一个名称在求值时,得到当前环境下最早 查找到 的存在该名称的帧下该名称绑定的值。
以如下代码片段举例:
def square(square):
return mul(square,square)
该函数可以正常工作并返回某数的平方,这是因为如下图所示,不妨传入参数 square(-2) 这一表达式的运算符 square 求值时,我们正处于全局帧下,全局帧下 square 的值为 func mul();而执行函数体,对 mul(-2, -2) 这一表达式求值时,我们处于 square 帧下,此时 square 已经有绑定值,为
/Pasted%20image%2020250225151857.png)
因此,更具体地来说,赋值语句用于在当前帧中改变名称与值的绑定关系 。 具体执行过程为:
- 从左至右逐个求出等号右边所有表达式的值
- 将求出的值对应绑定到等号左边给出的名称中
Python 中有一个特殊值 None,即无内容(nothing)。Python 中一个没有明确返回值的函数实际上会返回 None。当 None 作为表达式的值时,Python 解释器不会显示该值。
由此我们可以将函数分为两类:纯函数(Pure Functions) 与 非纯函数(Non-Pure Functions) 。纯函数只会接收参数并返回表达式的值,不产生其它任何影响,例如 abs(),pow();非纯函数有输出输出,但同时也有副作用,例如 print()。副作用不是一个值,而是调用一个函数后产生的任何除返回值之外的其它结果。
在了解如下概念后,理解语句 print(print(1), print(2)) 的输出就很简单了。套用表达式的执行过程,我们得到如下结果:/Pasted%20image%2020250225195137.png)
逻辑运算符 and 与 or 存在 ”短路“ 行为。然而需要注意的是,表达式 <left> and <right> 的值不是简单的真或假。如果表达式 <left> 的值是一个假值(例如 0、' '、None),则该表达式的值为表达式 <left> 的值。反之等于表达式 <right> 的值。对于 or 也类似。
>>> 2 and 3
3
>>> 2 or 3
2